<?php

/**
 * Component.php
 * 
 * 组件基类
 * @author wang <wang@fvzone.com>
 * @copyright  Copyright (c) 2010 Fire vision Software Studio
 * @link http://www.fvzone.com
 * @license New BSD License.{@link http://www.opensource.org/licenses/bsd-license.php}
 * @version $Id: Component.php 1.1 2011-8-12 22:48:01Z wang $
 * @package core
 * @since 1.0
 */

defined('IN_WORK') or exit('Authorization error');

/** 
 * 组件基类
*/
class Component extends Work
{
    /**
     * 已经注册的菜单列表
     * @var array
     */
    public static $menu = array();

    /**
     * 已经注册的权限列表
     * @var array
     */
    public static $access = array();

    /**
     * 已经启用的组件列表
     * @var array
     */
    public static $active = array();

    /**
     * 组件子类实现具体逻辑
     */
    public function before()
    {
    }

    /**
     * 组件需要安装的时候执行
     * 用于SQL安装、数据库初始化、文件安装到项目
     */
    public function install()
    {
    }

    /**
     * 组件卸载的时候执行
     * 用于删除本组件在项目中的文件和一些资源
     */
    public function uninstall()
    {
    }
    
    /**
     * 组件基础初始化
     * 用于初始化组件环境，注册菜单，注册权限
     *
     */
    public static function init()
    {
        //读取已经启用的组件
        $file = PUBLIC_DIR.'config/component.php';
        if(is_file($file))
        {
            self::$active = include $file;
            
            //初始化所有已经配置的组件
            foreach (self::$active as $k => $v)
            {
                //加载启用组件的初始化类
                if (import('components.'.$k.'.init'))
                {
                    //建立组件初始化类的反射类
                    $class  = new ReflectionClass(ucfirst($k).'_Init_Component');
                    //实例化此类
                    $object = $class->newInstance();
                    //获取类中的方法并执行
                    $class->getMethod('before')->invoke($object);
                }
            }
        }
    }

    /**
     * 注册权限控制列表到项目
     *
     * @param string $component 	组件名称
     * @param string $name 	        权限名称
     * @param string $title 		权限说明
     * @param int    $description 	权限描述
     * @return void
     */
    public static function accessItem($component, $name, $title, $description = null)
    {
        self::$access[$component][$name] = array('name' => $name, 'type' => 'access', 'title' => $title, 'description' => $description);
    }
    
    /**
     * 注册组件菜单到项目，本函数支持无限级添加时候自动构建树形数组
     *
     * @param string $name 		菜单名称
     * @param string $title 	菜单说明
     * @param string $url 		菜单URL
     * @param int    $parent 	父类菜单，只要指定父类菜单的$name名称，如果子菜单需要以(.)分割
     * @param int    $enable 	是否显示
     * @param int    $order 	排序
     * @return void
     */
    public static function menuItem($name = '', $title = '', $url = '', $parent = 'root', $enable = 1, $order = 0)
    {
        //自增排序
        static $auto_order = 10;
        if($order == 0)
        {
            $order = $auto_order;
            $auto_order += 10;
        }

        //组合菜单数据
        $item = array(
            'name'        => $name,
            'type'        => 'menu',
            'title'       => $title, 
            'url'         => $url,
            'enable'      => $enable,
            'description' => null,
            'order'       => $order
        );
        
        //检查菜单是否是子菜单
        if (strpos($parent, '.') !== false)
        {
            $key = '["' . implode('"]["', explode('.', $parent)) . '"][$name]';
            //这句代码是将$key组合的数组键进行赋值
            eval("self::\$menu$key = \$item;");
        }
        else
        {
            self::$menu[$parent][$name] = $item;
        }
    }
}